package com.haidechizi.sort;

import java.util.Arrays;

/**
 * @author: wangdejun
 * @create: 2020-01-10 14:56
 * <p>
 * 归并排序
 **/
public class MergeSort {

    public static void main(String[] args) {
//        int[] arr = new int[]{1, 3, 5, 2, 4, 6, 8};
        int[] arr = new int[]{9, 3, 6, 5, 4, 6, 7, 3, 2, 9, 2, 6};
        System.out.println(Arrays.toString(arr));
//        merge(arr, 0, 2, arr.length - 1);
        mergeSort(arr, 0, arr.length - 1);
        System.out.println(Arrays.toString(arr));

    }

    public static void mergeSort(int[] arr, int start, int end) {
        // 结束条件
        if (start >= end) {
            return;
        }
        // 中间位置
        int middle = (start + end) / 2;
        // 归并左侧的数据
        mergeSort(arr, start, middle);
        // 归并右侧的数据
        mergeSort(arr, middle + 1, end);
        // 进行合并
        merge(arr, start, middle, end);
    }


    // 合并两个数组
    public static void merge(int[] arr, int start, int middle, int end) {
        // 定义临时数组，存放合并之后的数据
        int[] temp = new int[end - start + 1];
        int low = start;
        int high = middle + 1;
        int index = 0;
        // 虚幻数组，将小的数字按照顺序放入到临时数组中
        while (low <= middle && high <= end) {
            if (arr[low] <= arr[high]) {
                temp[index] = arr[low];
                low++;
            } else {
                temp[index] = arr[high];
                high++;
            }
            index++;
        }

        // 将剩余的数字直接放入到临时数组中
        while (low <= middle) {
            temp[index] = arr[low];
            low++;
            index++;
        }

        while (high <= end) {
            temp[index] = arr[high];
            high++;
            index++;
        }

        // 将临时数组中的数据写入到原数组中
        for (int k = 0; k < temp.length; k++) {
            arr[start + k] = temp[k];
        }
    }
}
